package com.example.github.reflect.demo;

import com.example.github.reflect.entity.Person;

import java.lang.reflect.Field;

/**
 * 使用Class对象
 * Field[] getFields()：获取所有的 public 修饰的成员变量，包括从父类继承来的 public 成员变量
 * Field getField(String name)：获取指定名称的 public 修饰的成员变量，包括从父类继承来的 public 成员变量
 * Field[] getDeclaredFields()：获取本类所有的成员变量，但是不能获取继承来的成员变量
 * Field getDeclaredField(String name)：获取本类指定名称的成员变量，但是不能获取继承来的成员变量
 */
public class UsePerson {
    public static void main(String[] args) throws Exception {
        Field[] declaredFields = Person.class.getDeclaredFields(); // 获取本类中的字段名（不包含父类继承的public 字段）
        for (Field field : declaredFields) {
            System.out.println(field);
        }
        System.out.println("=======================");
        Field[] fields = Person.class.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("=======================");
        // 注意：name 是 public 的，默认是 null
        Field field = Person.class.getDeclaredField("name");
        System.out.println(field);
        System.out.println("=======================");
        Field sex = Person.class.getField("sex");
        System.out.println(sex);

        /*
        private java.lang.String com.example.github.reflect.entity.Person.name
        private int com.example.github.reflect.entity.Person.age
        =======================
        public java.lang.String com.example.github.reflect.entity.Human.sex
        =======================
        private java.lang.String com.example.github.reflect.entity.Person.name
        =======================
        public java.lang.String com.example.github.reflect.entity.Human.sex
         */
        System.out.println("=======================");
        Person person = new Person();
        Object name = field.get(person);
        System.out.println(name); // null
        field.set(person, "李四");
        System.out.println("=======================");
        System.out.println(person);
    }
}
